# inc/config.py
import os
import sys
import json
from dotenv import load_dotenv
from datetime import datetime, timedelta


def get_base_path():
    """获取应用基础路径，兼容打包环境"""
    if getattr(sys, 'frozen', False):
        # 打包后的环境 - 使用可执行文件所在目录
        base_path = os.path.dirname(sys.executable)
    else:
        # 开发环境 - 使用项目根目录
        base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
    return base_path


def load_configuration():
    """加载配置，优先从应用根目录加载配置文件"""
    base_path = get_base_path()

    # 首选：应用根目录的配置文件
    root_env_path = os.path.join(base_path, '.env')

    # 备选：开发环境的配置文件位置
    dev_env_path = os.path.join(os.path.dirname(__file__), '.env')

    # 首选应用根目录的配置文件
    if os.path.exists(root_env_path):
        load_dotenv(root_env_path)
        print(f"✅ 从应用根目录加载配置文件: {root_env_path}")
    # 备选开发环境的配置文件
    elif os.path.exists(dev_env_path):
        load_dotenv(dev_env_path)
        print(f"ℹ️  从开发环境加载配置文件: {dev_env_path}")
    else:
        # 如果都没有找到，尝试从打包资源中加载
        try:
            if getattr(sys, 'frozen', False):
                # 打包环境下，尝试从临时资源目录加载
                internal_env_path = os.path.join(sys._MEIPASS, '.env')
                if os.path.exists(internal_env_path):
                    # 将配置文件复制到应用根目录供后续使用
                    import shutil
                    shutil.copy2(internal_env_path, root_env_path)
                    load_dotenv(root_env_path)
                    print(f"✅ 从内部资源复制配置文件到根目录: {root_env_path}")
                else:
                    load_dotenv()
                    print("ℹ️  使用默认环境变量")
            else:
                load_dotenv()
                print("ℹ️  使用默认环境变量")
        except Exception as e:
            print(f"⚠️  配置文件加载失败: {e}")
            load_dotenv()

# 加载配置
load_configuration()


class Config:
    # 时区设置
    import pytz
    DEFAULT_TIMEZONE = os.environ.get('DEFAULT_TIMEZONE', 'Asia/Shanghai')
    TIMEZONE = pytz.timezone(DEFAULT_TIMEZONE)

    # 获取基础路径
    BASE_DIR = get_base_path()

    # 数据库路径 - 确保在可写目录中
    def get_database_path():
        """获取应用基础路径，兼容打包环境"""
        if getattr(sys, 'frozen', False):
            base_path = os.path.dirname(sys.executable)
        else:
            # 开发环境也使用项目根目录
            base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))

        db_dir = os.path.join(base_path, 'database')
        os.makedirs(db_dir, exist_ok=True)
        db_path = os.path.join(db_dir, 'kdcms_data.db')
        return f'sqlite:///{db_path}'

    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL', get_database_path())
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # 文件上传配置
    def get_upload_path():
        base_dir = os.path.dirname(sys.executable)
        if getattr(sys, 'frozen', False):
            base_dir  = os.path.join(base_dir, 'uploads')
        else:
            base_dir  = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))

        upload_dir = os.path.join(base_dir, 'uploads')

        os.makedirs(upload_dir, exist_ok=True)
        return upload_dir

    UPLOAD_FOLDER = get_upload_path()
    ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'}
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB

    # 企业微信配置
    WECHAT_CORP_ID = os.environ.get('WECHAT_CORP_ID', '')
    WECHAT_CORP_SECRET = os.environ.get('WECHAT_CORP_SECRET', '')
    WECHAT_AGENT_ID = os.environ.get('WECHAT_AGENT_ID', '')

    # 会话安全配置
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SECURE = os.environ.get('SESSION_COOKIE_SECURE', False)
    SESSION_COOKIE_SAMESITE = 'Lax'
    REMEMBER_COOKIE_HTTPONLY = True
    REMEMBER_COOKIE_SECURE = os.environ.get('REMEMBER_COOKIE_SECURE', False)
    REMEMBER_COOKIE_DURATION = timedelta(days=7)

    @staticmethod
    def get_current_time():
        """获取当前本地时间"""
        return datetime.now(Config.TIMEZONE)

    @classmethod
    def init_app(cls, app):
        # 设置SQLAlchemy使用本地时区
        app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
            'connect_args': {
                'options': '-c timezone=Asia/Shanghai'
            }
        }

        # 添加会话安全配置
        # 避免重复初始化数据库
        if hasattr(app, 'extensions') and 'sqlalchemy' in app.extensions:
            return

        # 应用启动时尝试从数据库加载配置
        try:
            from inc.models import db, DatabaseConfig, WechatConfig

            with app.app_context():
                # 如果数据库表不存在，先创建
                db.create_all()

                # 获取激活的数据库配置
                db_config = DatabaseConfig.query.filter_by(is_active=True).first()
                if db_config:
                    # 动态更新数据库URI
                    if db_config.db_type.lower() == 'mysql':
                        app.config['SQLALCHEMY_DATABASE_URI'] = (
                            f"mysql+pymysql://{db_config.username}:{db_config.password}"
                            f"@{db_config.host}:{db_config.port}/{db_config.database}"
                        )
                    elif db_config.db_type.lower() == 'sqlite':
                        # 确保SQLite数据库路径正确
                        db_path = db_config.database
                        if not os.path.isabs(db_path):
                            db_path = os.path.join(cls.BASE_DIR, db_path)
                        app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{db_path}"

                # 获取企业微信配置
                wechat_config = WechatConfig.query.first()
                if wechat_config:
                    app.config['WECHAT_CORP_ID'] = wechat_config.corp_id
                    app.config['WECHAT_CORP_SECRET'] = wechat_config.corp_secret
                    app.config['WECHAT_AGENT_ID'] = wechat_config.agent_id

        except Exception as e:
            # 处理数据库尚未初始化的情况
            app.logger.error(f"加载数据库配置时出错: {e}")


class DevelopmentConfig(Config):
    DEBUG = True


class ProductionConfig(Config):
    DEBUG = False


config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}